﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos
Imports System.Transactions

Public Class PerfilBL
    Public Function RegistrarPerfil(ByVal TokenConexion As String, ByVal Perfil As perfilBE, ByVal Procesos As List(Of ProcPerBE),
                                    ByRef detResp As DetalleRespuesta) As Boolean
        Dim PerfilDAL As PerfilDAL = New PerfilDAL("")
        Dim boolTransaccionCompletada As Boolean = False
        detResp.Mensajes = ""
        Dim IdPerfil As Integer = 0
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaRegistrar(Perfil, Procesos, detResp.Mensajes)) Then
                PerfilDAL = New PerfilDAL(TokenConexion)
                If (PerfilDAL.existePerfil(Perfil.Perfil)) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_PreviamenteRegistrado,
                                             "Existe un registro con la descripción del perfil indicado." & vbCrLf & detResp.Mensajes)
                    Return False
                Else
                    Using transacCta As TransactionScope = New TransactionScope()
                        If (PerfilDAL.registraPerfil(Perfil, IdPerfil)) Then
                            If (PerfilDAL.registraPermisos(Procesos, IdPerfil)) Then
                                boolTransaccionCompletada = True
                            End If
                            If (boolTransaccionCompletada) Then
                                transacCta.Complete()
                                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                                         "El Perfil se registro con éxito.")
                                Return True
                            Else
                                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                         "El Perfil no pudo ser registrado en el sistema." & vbCrLf & detResp.Mensajes)
                                Return False
                            End If
                        Else
                            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueRegistrado,
                                                     "El Perfil no pudo ser registrado en el sistema." & vbCrLf & detResp.Mensajes)
                            Return False
                        End If
                    End Using
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Perfil no es valido para registrar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "PerfilBL.RegistrarPefil")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al registrar Perfil: " & ex.Message)
            Return False
        Finally
            PerfilDAL = Nothing
        End Try
    End Function

    Private Function EsValidoParaRegistrar(ByRef Perfil As perfilBE, ByVal Procesos As List(Of ProcPerBE), ByRef mensaje As String) As Boolean
        mensaje = ""
        Dim index As Int16 = 0
        Try
            If (String.IsNullOrWhiteSpace(Perfil.Perfil)) Then
                mensaje &= "La descripcion del Perfil es obligatoria, no puede ir el campo vacio." & vbCrLf
            Else
                Perfil.Perfil = Perfil.Perfil.Trim
                If (Perfil.Perfil.Length > 25) Then
                    Perfil.Perfil = Perfil.Perfil.Substring(0, 25)
                End If
            End If

            If (Procesos Is Nothing OrElse Procesos.Count = 0) Then
                mensaje &= "El Listado de Permisos es requerido." & vbCrLf
            Else
                For Each permisoProc As ProcPerBE In Procesos
                    If (permisoProc Is Nothing) Then
                        mensaje &= String.Format("Permiso en índice {0} nulo, favor de verificar.{1}", index, vbCrLf)
                    ElseIf (permisoProc.Total = ProcPerBE.TotalPermiso.No And permisoProc.Consulta = ProcPerBE.ConsultaPermiso.No And permisoProc.Negar = ProcPerBE.NegarPermiso.No) Then
                        mensaje &= String.Format("Debe asignar permisos al Proceso {0} ({1}).{2}", permisoProc.proceso, permisoProc.idProceso, vbCrLf)
                    End If
                    index = index + 1
                Next
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "PerfilBL.EsValidoParaRegistrar")
            mensaje &= ex.Message
            Return False
        Finally
            index = Nothing
        End Try
    End Function

    Public Function ActualizaPerfil(ByVal TokenConexion As String, ByVal Perfil As perfilBE, ByVal Procesos As List(Of ProcPerBE),
                                    ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim boolTransaccionCompletada As Boolean = False
        Dim PerfilDAL As PerfilDAL = New PerfilDAL("")
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaRegistrar(Perfil, Procesos, detResp.Mensajes)) Then
                PerfilDAL = New PerfilDAL(TokenConexion)
                If (Perfil.Perfil.ToUpper() <> "ADMINISTRADOR") Then
                    Using transacCta As TransactionScope = New TransactionScope()
                        If (PerfilDAL.actualizaPerfil(Perfil)) Then
                            If (PerfilDAL.actualizaPermisos(Procesos, Perfil.IdPerfil)) Then
                                transacCta.Complete()
                                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                                         "Datos de Perfil actualizados.")
                                Return True
                            Else
                                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                                 "No se pudo realizar la actualización de Perfil." & vbCrLf & detResp.Mensajes)
                                Return False
                            End If
                        Else
                            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                                 "No se pudo realizar la actualización de Perfil." & vbCrLf & detResp.Mensajes)
                            Return False
                        End If
                    End Using
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Perfil_AdministradorNoPuedeModificarse,
                                                 "El Perfil ADMINISTRADOR no puede ser actualizado." & vbCrLf & detResp.Mensajes)
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "PerfilBL.ActualizaPerfil")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualiza rPerfil: " & ex.Message)
            Return False
        Finally
            PerfilDAL = Nothing
        End Try
    End Function

    Public Function GetPerfil(ByVal tokenConexion As String, ByVal IdPerfil As Integer,
                              ByRef detResp As DetalleRespuesta) As List(Of perfilpermiBE)
        detResp.Mensajes = ""
        Dim PerfilDAL As PerfilDAL = New PerfilDAL("")
        Dim LsPerBE As List(Of perfilpermiBE)
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetPerfil(IdPerfil, detResp.Mensajes)) Then
                PerfilDAL = New PerfilDAL(tokenConexion)
                LsPerBE = PerfilDAL.getPerfil(IdPerfil)
                If (LsPerBE IsNot Nothing) Then
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo la información del Perfil con éxito.")
                    Return LsPerBE
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                                 "No se obtuvo la información del Perfil" & vbCrLf & detResp.Mensajes)
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                     "El ID del Perfil contiene valor invalido " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "PerfilBL.GetPerfil")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener información del Perfil: " & ex.Message)
            Return Nothing
        Finally
            PerfilDAL = Nothing
            LsPerBE = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetPerfil(ByRef IdPerfil As Integer, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrEmpty(IdPerfil)) Then
                mensaje &= "El campo ID del Perfil no puede ir  vacio." & vbCrLf
            Else
                If (IdPerfil <= 0) Then
                    mensaje &= String.Format("El ID <{0}> del Perfil debe ser un valor mayor a 0", IdPerfil) & vbCrLf
                End If
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "PerfilBL.EsValidoParaGetPerfil")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetListadoPerfiles(ByVal tokenConexion As String, ByRef detResp As DetalleRespuesta) As List(Of perfilBE)
        detResp.Mensajes = ""
        Dim PerfilDAL As PerfilDAL = New PerfilDAL("")
        Dim listPerfilesBE As List(Of perfilBE)
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            PerfilDAL = New PerfilDAL(tokenConexion)
            listPerfilesBE = PerfilDAL.getListadoPerfil()
            If (listPerfilesBE IsNot Nothing) Then
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK, "Se obtuvo el listado de Perfiles con éxito.")
                Return listPerfilesBE
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoObtuvoRegistrosParaListado,
                                         "No se obtuvo el listado de Perfiles" & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "PerfilBL.GetListadoPerfiles")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener el listado de Perfiles: " & ex.Message)
            Return Nothing
        Finally
            PerfilDAL = Nothing
            listPerfilesBE = Nothing
        End Try
    End Function

End Class
